package com.qf.cloud2203.service1.controller;

import com.netflix.appinfo.InstanceInfo;
import com.netflix.discovery.EurekaClient;
import com.qf.cloud2203.domain.entity.Vote;
import com.qf.cloud2203.domain.vo.ResultVo;
import com.qf.cloud2203.service1.feign.GenTokenClient;
import com.qf.cloud2203.service1.feign.Service2Client;
import com.qf.cloud2203.service1.feign.VoteClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.util.Date;
import java.util.HashMap;
import java.util.List;

@RestController
@RequestMapping("/service1")
public class TestController {

    @Qualifier("eurekaClient")
    @Autowired
    EurekaClient eurekaClient;

    @Autowired
    Service2Client service2Client;

    @Autowired
    GenTokenClient genTokenClient;

    @Autowired
    VoteClient voteClient;

    @GetMapping("/test7")
    public ResultVo test7(){
        final ResultVo vo = genTokenClient.getToken("13800001111");

        final String token = (String) vo.get("data");

        final ResultVo dovote = voteClient.dovote("13800001111", 5, token);

        return dovote;
    }



    @GetMapping("/test6")
    public Vote test6(){
        final Vote vote = service2Client.deleteVote(100);
        return vote;
    }


    @GetMapping("/test5")
    public Vote test5(){

        final Vote vote = new Vote();
        vote.setId(10);
        vote.setCandidateId(5);
        vote.setPhone("13566667777");
        vote.setUpdateTime(new Date());
        final Vote vote1 = service2Client.updateVote(vote);
        return vote1;
    }


    @GetMapping("/test4")
    public List<Vote> test4(){
        final List<Vote> voteList = service2Client.getVoteList();
        return voteList;
    }


    /**
     * 使用feignclient进行服务调用
     * @return
     */
    @GetMapping("/test3")
    public String test3(){
        final String result = service2Client.home();
        return result;
    }


    /**
     * 测试调用 vote 微服务 的接口
     * post请求
     * @return
     */
    @GetMapping("/test2")
    public ResultVo test2(){

        //1 获取token
        String serviceName = "GENTOKEN";

        /**
         * 获取指定微服务的信息
         * 参数1：微服务的名称，从eureka中查
         * 参数2: false 代表 接口不是https协议
         */
        final InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka(serviceName, false);

        // 获取 接口 信息，格式 ： http:// ip:port
        final String homePageUrl = instanceInfo.getHomePageUrl();

        System.out.println(homePageUrl);

        // springboot 中如何发送 http请求
        final RestTemplate restTemplate = new RestTemplate();

        String url = homePageUrl+"redisvote/gettoken?phone={phone}";

        // 发送get请求
        /**
         * 参数1： url
         * 参数2：返回的响应体中的数据封装成什么类型，如果返回的是json，可以直接使用 hashmap
         * 参数3:  用于替换 参数1url中大括号部分的内容
         */
        final HashMap result = restTemplate.getForObject(url, HashMap.class, "13866668888");

        final String token = (String) result.get("data");

        // 2. 调用 vote服务的 dovote接口
        // 接口路径 /vote/dovote

        String voteServiceName = "VOTE";

        final InstanceInfo voteInstanceInfo = eurekaClient.getNextServerFromEureka(voteServiceName, false);

        final String voteHostAndPort = voteInstanceInfo.getHomePageUrl();

        String voteUrl = voteHostAndPort+"vote/dovote";


        // 处理请求头
        final HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.set("token",token);

        // 处理请求体
        final LinkedMultiValueMap<String, String> body = new LinkedMultiValueMap<>();
        body.add("phone","13566667777");
        body.add("cadidateId","6");


        final HttpEntity<LinkedMultiValueMap<String, String>> requestEntity = new HttpEntity<>(body,httpHeaders);

        /**
         * 发送 http请求的通用方法
         * 参数1：url
         * 参数2：请求的方式，get，post
         * 参数3：封装了请求头和请求体的对象
         * 参数4：返回值封装成什么类型
         * 参数5：变长参数，对应 url中 {}
         */
        final ResponseEntity<HashMap> voteResult = restTemplate.exchange(voteUrl, HttpMethod.POST, requestEntity, HashMap.class);

        final HashMap voteBody = voteResult.getBody();

        return ResultVo.ok(voteBody);
    }


    /**
     * 如何调用已经存在的微服务中的接口
     * 例如，调用 token 服务的 /redisvote/gettoken?phone=13899998888
     * @return
     */
    @GetMapping("/test1")
    public ResultVo test1(){

        String serviceName = "GENTOKEN";

        /**
         * 获取指定微服务的信息
         * 参数1：微服务的名称，从eureka中查
         * 参数2: false 代表 接口不是https协议
         */
        final InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka(serviceName, false);

        // 获取 接口 信息，格式 ： http:// ip:port
        final String homePageUrl = instanceInfo.getHomePageUrl();

        System.out.println(homePageUrl);

        // springboot 中如何发送 http请求
        final RestTemplate restTemplate = new RestTemplate();

        String url = homePageUrl+"redisvote/gettoken?phone={phone}";

        // 发送get请求
        /**
         * 参数1： url
         * 参数2：返回的响应体中的数据封装成什么类型，如果返回的是json，可以直接使用 hashmap
         * 参数3:  用于替换 参数1url中大括号部分的内容
         */
        final HashMap result = restTemplate.getForObject(url, HashMap.class, "13866668888");

        System.out.println(result);

        return ResultVo.ok(result.get("data"));
    }

}
